/**
 * https://leetcode-cn.com/problems/remove-element/
 * 移除元素
 * @param nums 数组
 * @param val 要移除的元素
 */
const removeElement = (nums: number[], val: number): number => {
    let len = nums.length;

    // 数组为空
    if (len < 1) return 0

    // 双指针
    let l = 0,
        r = len

        
    while (l < r) {
        if (nums[l] === val) {
            // 从最后往前移动
            nums[l++] = nums[++r]
        } else {
            l++
        }
    }
    return l
}


const removeElement3 = (nums: number[], val: number): number => {
    const len = nums.length;

    // 数组为空
    if (len < 1) return 0

    // 1. 先排序
    nums.sort((a, b) => a - b)

    // 2. 快慢指针
    let s = 0

    // 3 遍历数组
    while (s < len) {
        // 找到了要删除的元素
        if (nums[s] === val) {
            // 往后找到这个元素的结尾索引
            let f = s + 1;
            while (f < len) {
                if (nums[f] !== val) {
                    break;
                }
                f++
            }
            // 删除s到f之间的元素
            nums.splice(s, f - s)
            break;
        }
        s++
    };
    return nums.length;
}

// splice
const removeElement2 = (nums: number[], val: number): number => {
    const len = nums.length;

    // 数组为空
    if (len < 1) return 0

    let m = 0;
    while (m < len) {
        if (nums[m] === val) {
            nums.splice(m, 1)
        } else {
            // 为空
            if (nums[m] == undefined) break;
            m++
        }
    }
    return nums.length;
};


